package threadnotsafe;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;

public class ListNotSafe {
    /**
     * List的常用实现类
     * 1、ArrayList 底层是Object类型的数组，常用于查询频繁，线程不安全.
     *  动态扩容，初始数组大小为10，第二次为原来的一半 10+10/2=15
     *  解决ArrayList线程不安全的方法：
         *  1）使用Vector来代替，但是效率很低
         *  2）Collections.synchronizedList(new ArrayList<>());
         *  3) CopyOnWriteArrayList();写时复制： 在写的时候复制一份数据，写完了之后再更新到原来的数据中
     * 2、LinkedList 底层是链表，常用于插入频繁，线程不安全
     *
     * 3、Vector 线程安全，但是效率低下
     *
     *
     * java.util.ConcurrentModificationException 线程争抢错误，在对数组写的
     * 时候同时进行读，类似于在一张纸上面同时写和读，很容易将纸弄坏
     */
    public static void main(String[] args) {
        List list = new ArrayList();
        Set set = new HashSet(); //hashSet底层是用的HashMap
        Set set1 = new CopyOnWriteArraySet();//解决Set的线程不安全

        Map map = new ConcurrentHashMap();//解决Map线程不安全代码
        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                list.add(new Random().nextInt());
                System.out.println(list);
            },String.valueOf(i)).start();
        }

    }
}
